package com.specter.dev.code.execute;

import java.io.IOException;

import com.specter.dev.code.builder.GenConfiguration.ModuleOutput;
import com.specter.dev.code.builder.GenConfiguration.ModuleOutputFile;
import com.specter.utils.BeanUtils;
import com.specter.utils.FreemarkerUtils;
import com.specter.utils.StringUtils;

import org.apache.commons.io.FileUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * Note:默认的写文件的实现类
 * 
 * @author Liang.Wang
 * @version Mar 23, 2017
 */
@Slf4j
public class ModuleOutputExeDefault implements ModuleOutputExe {
	protected static String DEFAULT_FTL = "com/specter/dev/code/template";

	@Override
	public void output(ModuleOutput output, DataModel data) {

		for (Object entity : data.getInputs()) {
			// 1.封装相应的数据
			data.setBean(BeanUtils.obj2Map(entity));

			// 2.逐个对象创建文件
			for (ModuleOutputFile file : output.getFiles()) {
				String mName = data.meta("name").toString();// 模块名称
				String fBase = dir(output.getBase(), output.getPkg(), mName, file.getPkg());
				String fName = fileName(String.format(file.getName(), data.bean("entityName").toString()));

				data.file("pkg_base", output.getPkg() + "." + mName);// java当前模块包
				data.file("pkg_this", output.getPkg() + "." + mName + "." + file.getPkg());// java文件包

				data.file("file_name", fName.substring(0, fName.lastIndexOf(".")));// java类名
				data.file("file_path", fBase + fName);// 文件全路径（含后缀的）

				this.output(file, data);
			}
		}
	}

	/**
	 * 将一个实体信息转换到一个输出文件
	 * 
	 * @param output 输出配置
	 * 
	 * @param data   单个实体对象数据Map
	 * 
	 */
	public void output(ModuleOutputFile file, DataModel data) {
		try {
			String ftl = file.getFtl().replace("_DEFAULT", DEFAULT_FTL);
			String content = FreemarkerUtils.render(ftl, data.toMap());

			String f = System.getProperty("user.dir") + "/" + data.file("file_path");

			FileUtils.writeStringToFile(new java.io.File(f), content, "UTF-8");// 自动创建上级文件夹

			log.info("文件：{} 生成成功！", data.file("file_path"));

		} catch (IOException e) {
			log.error("make directory or make file failed!");
			e.printStackTrace();
		}
	}

	// 拼接dir路径
	private String dir(String... dirs) {
		StringBuilder sb = new StringBuilder("");
		for (String dir : dirs) {
			if (StringUtils.isNotBlank(dir)) {
				sb.append(dir.replace('.', '/')).append("/");
			}
		}
		return sb.toString();
	}

	// 转化文件名称
	private String fileName(String fileName) {
		if (fileName.endsWith(".java")) {
			fileName = Character.toUpperCase(fileName.charAt(0)) + fileName.substring(1); // 首字母大写

		} else if (fileName.endsWith(".xml")) {
			fileName = Character.toUpperCase(fileName.charAt(0)) + fileName.substring(1); // 首字母大写

		} else {// 其他的全部变为单词间用'-
			fileName = StringUtils.toViewName(fileName);// 变为 '-'

		}
		return fileName;
	}
}
